package com.cskaoyan.market.shiro;

import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.apache.shiro.web.util.WebUtils;
import org.springframework.stereotype.Component;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.Serializable;


@Component
public class MarketSessionManger extends DefaultWebSessionManager {

    private static final String WX_MARKET_TOKEN = "X-CskaoyanMarket-Token";

    /**
     * 表示的是服务器去接收编号，利用编号去查找session信息
     * 默认情况下是和java ee规范是一样，尝试先去查找有没有携带Cookie:JSESSIONID=xxx
     * 但是在跨域的情况下，或者在小程序中，那么前端代码不会携带cookie，此时我们肯定接收不到数据
     * 此时，我们可以重写该方法，自己去制定获取的策略
     * Cskaoyan-Market-Token：xxxx
     * @param request
     * @param response
     * @return
     */
    @Override
    protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
        //该方法就是纸老虎，就是吓唬人的，本质就是request.getHeader();
        String token = WebUtils.toHttp(request).getHeader(WX_MARKET_TOKEN);
        if(!StringUtils.isEmpty(token)){
            //不为空，利用X-CskaoyanMarket-Token来进行会话管理
            return token;
        }
        //使用httpSession来实现
        return super.getSessionId(request, response);
    }
}
